package practice.Day27;

/**
 * @Author quan
 * @Description 不用加减乘除做加法
 * @Date 2023/6/7 11:11
 */
public class Num1_NoAdd {
    /**
     * 写一个函数，要求两数之和，并且不使用加减乘除的运算符号
     * 位运算
     * @param num1
     * @param num2
     * @return
     */
    public int Add(int num1,int num2) {
        /**
         * 5+7=12;
         * 1、相加各位的值不算进位，得到2--->二进制每位相加相当于做异或；
         * 2、计算进位值，得到10；如果这一步计算的进位值是0，那么第一步得到的2就是结果；--->二进制计算进位值：相当于各位做与运算之后左移一位；
         * 3、重复上述两个步骤，直到想加的值变为上述两步得到的结果2与10之后，得到的结果12就是所求值。
         */
        while (num2 != 0){
            //1、异或。相加各位的值，不算进位
            int temp = (num1 ^ num2);
            //2、计算进位值：各位做与操作后再左移一位
            num2 = (num1 & num2) << 1;
            //3、重复上述两步，将各位相加的值 与进位值相加。直到进位值为0跳出循环
            num1 = temp;
        }
        return num1;
    }
}
